<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>Nginx面经 | 无人深空</title><meta name="keywords" content="Nginx"><meta name="author" content="zcm"><meta name="copyright" content="zcm"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="Nginx 面经1.Nginx 介绍 什么是 Nginx  Nginx是一个 轻量级 &#x2F; 高性能的反向代理Web服务器，用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议 Nginx 实现非常高效的反向代理、负载平衡，可以处理 2-3 万并发连接数，官方监测能支持 5万并发，现在中国使用 nginx 网站用户有很多，例如：新浪、网易、 腾讯等   Nginx 优点  跨平">
<meta property="og:type" content="article">
<meta property="og:title" content="Nginx面经">
<meta property="og:url" content="https://gitee.com/zcmmmm/zcmmmm/2022/10/16/Nginx%E9%9D%A2%E7%BB%8F/index.html">
<meta property="og:site_name" content="无人深空">
<meta property="og:description" content="Nginx 面经1.Nginx 介绍 什么是 Nginx  Nginx是一个 轻量级 &#x2F; 高性能的反向代理Web服务器，用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议 Nginx 实现非常高效的反向代理、负载平衡，可以处理 2-3 万并发连接数，官方监测能支持 5万并发，现在中国使用 nginx 网站用户有很多，例如：新浪、网易、 腾讯等   Nginx 优点  跨平">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png">
<meta property="article:published_time" content="2022-10-16T11:33:08.000Z">
<meta property="article:modified_time" content="2023-05-02T02:08:44.349Z">
<meta property="article:author" content="zcm">
<meta property="article:tag" content="Nginx">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://gitee.com/zcmmmm/zcmmmm/2022/10/16/Nginx%E9%9D%A2%E7%BB%8F/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = { 
  root: '/',
  algolia: undefined,
  localSearch: {"path":"/search.xml","preload":false,"languages":{"hits_empty":"找不到您查询的内容：${query}"}},
  translate: undefined,
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":200},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '天',
  date_suffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: undefined,
  lightbox: 'fancybox',
  Snackbar: {"chs_to_cht":"你已切换为繁体","cht_to_chs":"你已切换为简体","day_to_night":"你已切换为深色模式","night_to_day":"你已切换为浅色模式","bgLight":"#49b1f5","bgDark":"#1f1f1f","position":"bottom-left"},
  source: {
    justifiedGallery: {
      js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.js',
      css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.css'
    }
  },
  isPhotoFigcaption: false,
  islazyload: false,
  isAnchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
  title: 'Nginx面经',
  isPost: true,
  isHome: false,
  isHighlightShrink: false,
  isToc: true,
  postUpdate: '2023-05-02 10:08:44'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(win=>{
    win.saveToLocal = {
      set: function setWithExpiry(key, value, ttl) {
        if (ttl === 0) return
        const now = new Date()
        const expiryDay = ttl * 86400000
        const item = {
          value: value,
          expiry: now.getTime() + expiryDay,
        }
        localStorage.setItem(key, JSON.stringify(item))
      },

      get: function getWithExpiry(key) {
        const itemStr = localStorage.getItem(key)

        if (!itemStr) {
          return undefined
        }
        const item = JSON.parse(itemStr)
        const now = new Date()

        if (now.getTime() > item.expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return item.value
      }
    }
  
    win.getScript = url => new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = url
      script.async = true
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    })
  
      win.activateDarkMode = function () {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = function () {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
          if (t === 'dark') activateDarkMode()
          else if (t === 'light') activateLightMode()
        
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    
    const detectApple = () => {
      if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
        document.documentElement.classList.add('apple')
      }
    }
    detectApple()
    })(window)</script><link rel="stylesheet" href="/css/categories.css?v1"><link rel="stylesheet" href="/css/navigation.css?v1"><link rel="stylesheet" href="/css/custom.css?v1"><meta name="generator" content="Hexo 6.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="https://s2.loli.net/2022/09/22/36LN4kcjYOd9HT8.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">43</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">25</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">11</div></a></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div></div></div></div><div class="post" id="body-wrap"><header class="not-top-img" id="page-header"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">无人深空</a></span><div id="menus"></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div></div><div id="nav-right"><div id="search-button"><a class="site-page social-icon search"><i class="fas fa-search fa-fw"></i></a></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav></header><main class="layout" id="content-inner"><div id="post"><div id="post-info"><h1 class="post-title">Nginx面经</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2022-10-16T11:33:08.000Z" title="发表于 2022-10-16 19:33:08">2022-10-16</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2023-05-02T02:08:44.349Z" title="更新于 2023-05-02 10:08:44">2023-05-02</time></span><span class="post-meta-categories"><span class="post-meta-separator">|</span><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/categories/%E9%9D%A2%E7%BB%8F/">面经</a><i class="fas fa-angle-right post-meta-separator"></i><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/categories/Others/">Others</a></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-wordcount"><i class="far fa-file-word fa-fw post-meta-icon"></i><span class="post-meta-label">字数总计:</span><span class="word-count">8.6k</span><span class="post-meta-separator">|</span><i class="far fa-clock fa-fw post-meta-icon"></i><span class="post-meta-label">阅读时长:</span><span>28分钟</span></span><span class="post-meta-separator">|</span><span class="post-meta-pv-cv" id="" data-flag-title="Nginx面经"><i class="far fa-eye fa-fw post-meta-icon"></i><span class="post-meta-label">阅读量:</span><span id="busuanzi_value_page_pv"><i class="fa-solid fa-spinner fa-spin"></i></span></span></div></div></div><article class="post-content" id="article-container"><h2 id="Nginx-面经"><a href="#Nginx-面经" class="headerlink" title="Nginx 面经"></a>Nginx 面经</h2><h3 id="1-Nginx-介绍"><a href="#1-Nginx-介绍" class="headerlink" title="1.Nginx 介绍"></a>1.Nginx 介绍</h3><ol>
<li><p>什么是 Nginx</p>
<blockquote>
<p><strong>Nginx是一个 轻量级 &#x2F; 高性能的反向代理Web服务器</strong>，用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议</p>
<p>Nginx 实现非常高效的反向代理、负载平衡，可以处理 2-3 万并发连接数，官方监测能支持 5万并发，现在中国使用 nginx 网站用户有很多，例如：新浪、网易、 腾讯等</p>
</blockquote>
</li>
<li><p>Nginx 优点</p>
<ul>
<li><p>跨平台、配置简单</p>
</li>
<li><p>非阻塞、高并发连接：处理 2-3 万并发连接数，官方监测能支持 5 万并发</p>
</li>
<li><p>内存消耗小：开启 10 个 Nginx 才占 150M 内存</p>
</li>
<li><p>成本低廉，且开源</p>
</li>
<li><p>稳定性高，宕机的概率非常小</p>
</li>
<li><p>内置的健康检查功能</p>
<blockquote>
<p>如果有一个服务器宕机，会做一个健康检查，再发送的请求就不会发送到宕机的服务器了，而是重新将请求提交到其他的节点上</p>
</blockquote>
</li>
</ul>
</li>
<li><p>Nginx 应用场景</p>
<ul>
<li><p>http 服务器</p>
<blockquote>
<p>Nginx 是一个 http 服务，可以独立提供 http 服务</p>
<p>可以做网页静态服务器</p>
</blockquote>
</li>
<li><p>虚拟主机</p>
<blockquote>
<p>可以实现在一台服务器虚拟出多个网站，例如个人网站使用的虚拟机</p>
</blockquote>
</li>
<li><p>反向代理，负载均衡</p>
<blockquote>
<p>当网站的访问量达到一定程度后，单台服务器不能满足用户的请求时，需要用多台服务器集群可以使用 nginx 做反向代理</p>
<p>并且多台服务器可以平均分担负载，不会应为某台服务器负载高宕机而某台服务器闲置的情况</p>
</blockquote>
</li>
<li><p>Nginx 中也可以配置安全管理</p>
<blockquote>
<p>比如可以使用 Nginx 搭建 API 接口网关，对每个接口服务进行拦截</p>
</blockquote>
</li>
</ul>
</li>
</ol>
<h3 id="2-Nginx-怎么处理请求"><a href="#2-Nginx-怎么处理请求" class="headerlink" title="2.Nginx 怎么处理请求"></a>2.Nginx 怎么处理请求</h3><ol>
<li><p>Nginx 配置文件主要板块</p>
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">server <span class="punctuation">&#123;</span>         				# 第一个 Server 区块开始，表示一个独立的虚拟主机站点</span><br><span class="line">	listen       <span class="number">80</span>; 			# 提供服务的端口，默认 <span class="number">80</span></span><br><span class="line">	server_name  localhost; 	# 提供服务的域名主机名</span><br><span class="line">	location / <span class="punctuation">&#123;</span> 				# 第一个 location 区块开始</span><br><span class="line">		root   html; 			# 站点的根目录，相当于 Nginx 的安装目录</span><br><span class="line">		index  index.html index.html;  # 默认的首页文件，多个用空格分开</span><br><span class="line">	<span class="punctuation">&#125;</span>							# 第一个 location 区块结果</span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>处理请求步骤</p>
<ul>
<li><p>Nginx 启动，解析配置文件，</p>
<blockquote>
<p>得到需要监听的端口与 IP 地址，然后在 Nginx 的 Master 进程里面先初始化好这个监控的 Socket（创建 Socket，设置 addr、reuse 等选项，绑定到指定的 ip 地址端口，再 listen 监听）</p>
</blockquote>
</li>
<li><p>fork 出多个子进程</p>
</li>
</ul>
<blockquote>
<p>一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新进程被称为子进程</p>
</blockquote>
<ul>
<li><p>子进程会竞争 accept 新的连接</p>
<blockquote>
<p>此时客户端就可以向 nginx 发起连接了</p>
<p>当客户端与 nginx 进行三次握手，与 nginx 建立好一个连接</p>
<p>某一个子进程会 accept 成功，得到这个建立好的连接的 Socket，然后创建 nginx 对连接的封装，即 ngx_connection_t 结构体</p>
</blockquote>
</li>
<li><p>设置读写事件处理函数，并添加读写事件来与客户端进行数据的交换</p>
</li>
<li><p>Nginx 或客户端来主动关掉连接，到此完成一个请求</p>
</li>
</ul>
</li>
</ol>
<h3 id="3-Nginx-如何实现高并发"><a href="#3-Nginx-如何实现高并发" class="headerlink" title="3.Nginx 如何实现高并发"></a>3.Nginx 如何实现高并发</h3><blockquote>
<p>如果一个 server 采用一个进程（或者线程）负责一个 request 的方式，那么进程数就是并发数</p>
<p>那么显而易见的，就是会有很多进程在等待中。等什么？最多的应该是等待网络传输</p>
<p><strong>而 Nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候，这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题</strong></p>
<p>Nginx 是如何利用的呢，简单来说：同样的 4 个进程，如果采用一个进程负责一个 request 的方式，那么同时进来 4 个 request 之后，每个进程就负责其中一个，直至会话关闭</p>
<p>期间，如果有第 5 个 request 进来了，就无法及时反应，因为 4 个进程都没干完活呢，因此一般有个调度进程，每当新进来了一个 request ，就新开个进程来处理</p>
</blockquote>
<blockquote>
<p><strong>Nginx 不这样，每进来一个 request ，会有一个 worker 进程去处理。但不是全程的处理，处理到什么程度呢？处理到可能发生阻塞的地方，比如向上游（后端）服务器转发 request ，并等待请求返回</strong></p>
<p><strong>那么，这个处理的 worker 不会这么傻等着，他会在发送完请求后，注册一个事件：<code>如果 upstream 返回了，告诉我一声，我再接着干</code></strong></p>
<p><strong>此时，如果再有 request 进来，该线程就可以很快再按这种方式处理</strong></p>
<p><strong>而一旦上游服务器返回了，就会触发这个事件，worker 才会来接手，这个 request 才会接着往下走</strong></p>
</blockquote>
<blockquote>
<p>这就是为什么说，<strong>Nginx 基于事件模型</strong></p>
<p>由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中，实际上花费在 server 机器上的时间片不多。这是几个进程就解决高并发的秘密所在</p>
<p><strong>webserver 刚好属于网络 IO 密集型应用，不算是计算密集型</strong></p>
<p><strong>异步，非阻塞，使用 epoll ，和大量细节处的优化。也正是 Nginx 之所以然的技术基石</strong></p>
</blockquote>
<h3 id="4-Nginx-代理"><a href="#4-Nginx-代理" class="headerlink" title="4.Nginx 代理"></a>4.Nginx 代理</h3><ol>
<li><p>正向代理</p>
<blockquote>
<p>一个位于客户端和原始服务器（origin server）之间的服务器，为了从原始服务器取得内容，客户端向代理发送一个请求并指定目标（原始服务器），然后代理向原始服务器转交请求并将获得的内容返回给客户端</p>
<p>客户端才能使用正向代理</p>
<p><strong>正向代理总结就一句话：代理端代理的是客户端</strong></p>
<p>例如 OpenVPN 等等</p>
</blockquote>
</li>
<li><p>反向代理</p>
<blockquote>
<p>反向代理（Reverse Proxy）方式，是指以代理服务器来接受 Internet 上的连接请求，然后将请求，发给内部网络上的服务器并将从服务器上得到的结果返回给 Internet 上请求连接的客户端，<strong>此时代理服务器对外就表现为一个反向代理服务器</strong></p>
<p><strong>反向代理总结就一句话：代理端代理的是服务端</strong></p>
</blockquote>
</li>
<li><p>反向代理服务器的优点</p>
<blockquote>
<p><strong>反向代理服务器可以隐藏源服务器的存在和特征</strong></p>
<p><strong>它充当互联网云和 web 服务器之间的中间层</strong></p>
<p><strong>这对于安全方面来说是很好的，特别是当使用 web 托管服务时</strong></p>
</blockquote>
</li>
</ol>
<h3 id="5-Nginx-目录结构"><a href="#5-Nginx-目录结构" class="headerlink" title="5.Nginx 目录结构"></a>5.Nginx 目录结构</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@localhost ~]# tree /usr/local/nginx</span><br><span class="line">/usr/local/nginx</span><br><span class="line">├── client_body_temp</span><br><span class="line">├── conf                             # Nginx所有配置文件的目录</span><br><span class="line">│   ├── fastcgi.conf                 # fastcgi相关参数的配置文件</span><br><span class="line">│   ├── fastcgi.conf.default         # fastcgi.conf的原始备份文件</span><br><span class="line">│   ├── fastcgi_params               # fastcgi的参数文件</span><br><span class="line">│   ├── fastcgi_params.default       </span><br><span class="line">│   ├── koi-utf</span><br><span class="line">│   ├── koi-win</span><br><span class="line">│   ├── mime.types                   # 媒体类型</span><br><span class="line">│   ├── mime.types.default</span><br><span class="line">│   ├── nginx.conf                   # Nginx主配置文件</span><br><span class="line">│   ├── nginx.conf.default</span><br><span class="line">│   ├── scgi_params                  # scgi相关参数文件</span><br><span class="line">│   ├── scgi_params.default  </span><br><span class="line">│   ├── uwsgi_params                 # uwsgi相关参数文件</span><br><span class="line">│   ├── uwsgi_params.default</span><br><span class="line">│   └── win-utf</span><br><span class="line">├── fastcgi_temp                     # fastcgi临时数据目录</span><br><span class="line">├── html                             # Nginx默认站点目录</span><br><span class="line">│   ├── 50x.html                     # 错误页面优雅替代显示文件，例如当出现502错误时会调用此页面</span><br><span class="line">│   └── index.html                   # 默认的首页文件</span><br><span class="line">├── logs                             # Nginx日志目录</span><br><span class="line">│   ├── access.log                   # 访问日志文件</span><br><span class="line">│   ├── error.log                    # 错误日志文件</span><br><span class="line">│   └── nginx.pid                    # pid文件，Nginx进程启动后，会把所有进程的ID号写到此文件</span><br><span class="line">├── proxy_temp                       # 临时目录</span><br><span class="line">├── sbin                             # Nginx命令目录</span><br><span class="line">│   └── nginx                        # Nginx的启动命令</span><br><span class="line">├── scgi_temp                        # 临时目录</span><br><span class="line">└── uwsgi_temp                       # 临时目录</span><br></pre></td></tr></table></figure>

<h3 id="6-Nginx-配置文件-nginx-conf"><a href="#6-Nginx-配置文件-nginx-conf" class="headerlink" title="6.Nginx 配置文件 nginx.conf"></a>6.Nginx 配置文件 <code>nginx.conf</code></h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">worker_processes  1;			# worker进程的数量</span><br><span class="line">events &#123;                        # 事件区块开始</span><br><span class="line">	worker_connections  1024; 	# 每个worker进程支持的最大连接数</span><br><span class="line">&#125;                               # 事件区块结束</span><br><span class="line">http &#123;                          # HTTP区块开始</span><br><span class="line">	include       mime.types;  	# Nginx支持的媒体类型库文件</span><br><span class="line">	default_type  application/octet-stream;		# 默认的媒体类型</span><br><span class="line">	sendfile        on;			# 开启高效传输模式</span><br><span class="line">	keepalive_timeout  65;		# 连接超时</span><br><span class="line">	server &#123;                    # 第一个Server区块开始，表示一个独立的虚拟主机站点</span><br><span class="line">		listen       80;		# 提供服务的端口，默认80</span><br><span class="line">		server_name  localhost;	# 提供服务的域名主机名</span><br><span class="line">		location / &#123;            # 第一个location区块开始</span><br><span class="line">			root   html;		# 站点的根目录，相当于Nginx的安装目录</span><br><span class="line">			index  index.html index.htm;		# 默认的首页文件，多个用空格分开</span><br><span class="line">		&#125;                                   	# 第一个location区块结果</span><br><span class="line">		error_page   500502503504  /50x.html;	# 出现对应的http状态码时，使用50x.html回应客户</span><br><span class="line">		location = /50x.html &#123;  # location区块开始，访问50x.html</span><br><span class="line">			root   html;		# 指定对应的站点目录为html</span><br><span class="line">		&#125;</span><br><span class="line">	&#125;  </span><br><span class="line">    ......</span><br><span class="line"></span><br></pre></td></tr></table></figure>

<h3 id="7-为什么-Nginx-不适用多线程"><a href="#7-为什么-Nginx-不适用多线程" class="headerlink" title="7.为什么 Nginx 不适用多线程"></a>7.为什么 Nginx 不适用多线程</h3><ul>
<li><p><strong>Apache</strong></p>
<blockquote>
<p>创建多个进程或线程，而每个进程或线程都会为其分配 cpu 和内存（线程要比进程小的多，所以 worker 支持比 perfork 高的并发），并发过大会榨干服务器资源</p>
</blockquote>
</li>
<li><p><strong>Nginx</strong></p>
<blockquote>
<p>采用单线程来异步非阻塞处理请求（管理员可以配置 Nginx 主进程的工作进程的数量）(epoll)，不会为每个请求分配 cpu 和内存资源，节省了大量资源，同时也减少了大量的 CPU 的上下文切换</p>
<p>所以才使得 Nginx 支持更高的并发</p>
</blockquote>
</li>
</ul>
<h3 id="8-Nginx-和-apache-的区别"><a href="#8-Nginx-和-apache-的区别" class="headerlink" title="8.Nginx 和 apache 的区别"></a>8.Nginx 和 apache 的区别</h3><ul>
<li>轻量级，同样起 web 服务，比 apache 占用更少的内存和资源</li>
<li>抗并发，nginx 处理请求是异步非阻塞的，而 apache 则是阻塞性的，在高并发下 nginx 能保持低资源，低消耗高性能</li>
<li>高度模块化的设计，编写模块相对简单</li>
<li>最核心的区别在于 apache 是同步多进程模型，一个连接对应一个进程，nginx是异步的，多个连接可以对应一个进程</li>
</ul>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/nginx%E4%B8%8Eapache%E7%9A%84%E5%8C%BA%E5%88%AB.png" alt="nginx与apache的区别"></p>
<h3 id="9-动静分离"><a href="#9-动静分离" class="headerlink" title="9.动静分离"></a>9.动静分离</h3><ol>
<li><p>什么是动静分离</p>
<blockquote>
<p>动态资源、静态资源分离，是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来，动静资源做好了拆分以后我们就可以根据静态资源的特点将其做缓存操作，这就是网站静态化处理的核心思路</p>
<p><strong>动态资源、静态资源分离简单的概括是：动态文件与静态文件的分离</strong></p>
<p><strong>也常理解为：动态请求和静态请求分离</strong></p>
</blockquote>
</li>
<li><p>为什么要动静分离</p>
<blockquote>
<p>在软件开发中，有些请求是需要后台处理的（如：<code>.jsp、.do</code> 等等），有些请求是不需要经过后台处理的（如：<code>css、html、jpg、js</code> 等等文件），这些不需要经过后台处理的文件称为静态文件，否则称为动态文件</p>
<p>因此我们后台处理忽略静态文件，但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候，我们应该使用这种动静分离的策略去解决动、静分离将网站静态资源（HTML，JavaScript，CSS，img等文件）与后台应用分开部署，提高用户访问静态代码的速度，降低对后台应用访问</p>
<p><strong>将静态资源放到 Nginx 中，动态资源转发到 Tomcat 服务器中去</strong></p>
<p><strong>当然，因为现在七牛、阿里云等 CDN 服务已经很成熟，主流的做法，是把静态资源缓存到 CDN 服务中，从而提升访问速度</strong></p>
<p>相比本地的 Nginx 来说，CDN 服务器由于在国内有更多的节点，可以实现用户的就近访问。并且，CDN 服务可以提供更大的带宽，不像自己的应用服务，提供的带宽是有限的</p>
</blockquote>
</li>
<li><p>什么是 CDN 服务</p>
<blockquote>
<p><strong>CDN（Content Delivery Network） ，即内容分发网络</strong></p>
<p><strong>其目的是通过在现有的 Internet 中增加一层新的网络架构，将网站的内容发布到最接近用户的网络边缘，使用户可就近取得所需的内容，提高用户访问网站的速度</strong></p>
<p>一般来说，因为现在 CDN 服务比较大众，所以基本所有公司都会使用 CDN 服务</p>
</blockquote>
</li>
<li><p>Nginx 如何实现动静分离</p>
<blockquote>
<p>只需要指定路径对应的目录。location&#x2F;可以使用正则表达式匹配。并指定对应的硬盘中的目录</p>
<p>如下：（操作都是在Linux上）</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">location /image/ &#123;</span><br><span class="line">    root   /usr/local/static/;</span><br><span class="line">    autoindex on;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>步骤</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建目录</span></span><br><span class="line">mkdir /usr/local/static/image</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">进入目录</span></span><br><span class="line">cd  /usr/local/static/image</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">上传照片 photo.jpg</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">重启nginx</span></span><br><span class="line">sudo nginx -s reload</span><br></pre></td></tr></table></figure>

<p>打开浏览器 输入 <code>server_name/image/photo.jpg</code> 就可以访问该静态图片了</p>
</blockquote>
</li>
</ol>
<h3 id="10-Nginx负载均衡的算法怎么实现的-策略有哪些"><a href="#10-Nginx负载均衡的算法怎么实现的-策略有哪些" class="headerlink" title="10.Nginx负载均衡的算法怎么实现的?策略有哪些?"></a>10.Nginx负载均衡的算法怎么实现的?策略有哪些?</h3><blockquote>
<p>为了避免服务器崩溃，会通过负载均衡的方式来分担服务器压力</p>
<p>将对台服务器组成一个集群，当用户访问时，先访问到一个转发服务器，再由转发服务器将访问分发到压力更小的服务器</p>
<p>Nginx 负载均衡实现的策略有以下五种：</p>
</blockquote>
<ul>
<li><p><strong>轮询</strong></p>
<blockquote>
<p>每个请求按时间顺序逐一分配到不同的后端服务器，如果后端某个服务器宕机，能自动剔除故障系统</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">upstream backserver &#123; </span><br><span class="line">	server 192.168.10.120; </span><br><span class="line">	server 192.168.10.121; </span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>权重 weight（常用）</strong></p>
<blockquote>
<p>weight 的值越大，分配到的访问概率越高，主要用于后端每台服务器性能不均衡的情况下</p>
<p>其次是为在主从的情况下设置不同的权值，达到合理有效的地利用主机资源</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">权重越高，在被访问的概率越大，如下例，分别是20%，80%。</span></span><br><span class="line">upstream backserver &#123; </span><br><span class="line">     server 192.168.10.120 weight=2; </span><br><span class="line">     server 192.168.10.121 weight=8; </span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>ip_hash（IP 绑定）</strong></p>
<blockquote>
<p>每个请求按访问 IP 的哈希结果分配，使来自同一个 IP 的访客固定访问一台后端服务器</p>
<p>并且可以有效解决动态网页存在的 session 共享问题</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">upstream backserver &#123; </span><br><span class="line">     ip_hash; </span><br><span class="line">     server 192.168.10.120:80; </span><br><span class="line">     server 192.168.10.121:80; </span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>fair（第三方插件）</strong></p>
<blockquote>
<p>必须安装 upstream_fair 模块</p>
<p>对比 weight、ip_hash 更加智能的负载均衡算法，fair 算法可以根据页面大小和加载时间长短智能地进行负载均衡，<strong>响应时间短的优先分配</strong></p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">哪个服务器的响应速度快，就将请求分配到那个服务器上。</span></span><br><span class="line">upstream backserver &#123; </span><br><span class="line">     server server1; </span><br><span class="line">     server server2; </span><br><span class="line">     fair; </span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>url_hash（URL 绑定，第三方插件）</strong></p>
<blockquote>
<p>必须安装 Nginx 的 hash 软件包</p>
<p>按访问 url 的 hash 结果来分配请求，使每个 url 定向到同一个后端服务器，可以进一步提高后端缓存服务器的效率</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">upstream backserver &#123; </span><br><span class="line">     server squid1:3128; </span><br><span class="line">     server squid2:3128; </span><br><span class="line">     hash $request_uri; </span><br><span class="line">     hash_method crc32; </span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure></li>
</ul>
<h3 id="11-如何用Nginx解决前端跨域问题？"><a href="#11-如何用Nginx解决前端跨域问题？" class="headerlink" title="11.如何用Nginx解决前端跨域问题？"></a>11.如何用Nginx解决前端跨域问题？</h3><blockquote>
<p>使用 Nginx 转发请求</p>
<p>把跨域的接口写成调本域的接口，然后将这些接口转发到真正的请求地址</p>
</blockquote>
<h3 id="12-Nginx虚拟主机怎么配置？"><a href="#12-Nginx虚拟主机怎么配置？" class="headerlink" title="12.Nginx虚拟主机怎么配置？"></a>12.Nginx虚拟主机怎么配置？</h3><blockquote>
<p>所谓虚拟主机，在 Web 服务里就是一个独立的网站站点，这个站点对应独立的域名（也可能是IP 或端口），具有独立的程序及资源，可以独立地对外提供服务供用户访问</p>
<p>在 Nginx 中，使用一个 <code>server&#123;&#125;</code> 标签来标识一个虚拟主机，一个 Web 服务里可以有多个虚拟主机标签对，即可以同时支持多个虚拟主机站点</p>
<p>虚拟主机有三种类型：基于域名的虚拟主机、基于端口的虚拟主机、基于 IP 的虚拟主机</p>
</blockquote>
<ul>
<li><p>基于域名的虚拟主机：通过域名来区分虚拟主机</p>
<blockquote>
<p><strong>应用：外部网站</strong></p>
<p>需要建立 <code>/data/www /data/bbs</code> 目录，windows 本地 hosts 添加虚拟机 ip 地址对应的域名解析</p>
<p>对应域名网站目录下新增 <code>index.html</code> 文件</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/www目录下文件</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen       80;</span><br><span class="line">    server_name  www.lijie.com;</span><br><span class="line">    location / &#123;</span><br><span class="line">        root   data/www;</span><br><span class="line">        index  index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">当客户端访问bbs.lijie.com,监听端口号为80,直接跳转到data/bbs目录下文件</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen       80;</span><br><span class="line">    server_name  bbs.lijie.com;</span><br><span class="line">    location / &#123;</span><br><span class="line">        root   data/bbs;</span><br><span class="line">        index  index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</li>
<li><p>基于端口的虚拟主机：通过端口来区分虚拟主机</p>
<blockquote>
<p><strong>应用：公司内部网站，外部网站的管理后台</strong></p>
<p>使用端口来区分，浏览器使用域名或 <code>ip 地址:端口号</code>访问</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">当客户端访问www.lijie.com,监听端口号为81,直接跳转到data/www目录下文件</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen       81;</span><br><span class="line">    server_name  www.lijie.com;</span><br><span class="line">    location / &#123;</span><br><span class="line">        root   data/www;</span><br><span class="line">        index  index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">当客户端访问www.lijie.com,监听端口号为82,直接跳转到data/bbs目录下文件</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen       82;</span><br><span class="line">    server_name  www.lijie.com;</span><br><span class="line">    location / &#123;</span><br><span class="line">        root   data/bbs;</span><br><span class="line">        index  index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</li>
<li><p>基于 IP 的虚拟主机</p>
<blockquote>
<p>基于 IP 的虚拟主机在生产环境中不常使用</p>
<p>只需要将基于域名的虚拟主机中的域名修改为 IP 就可以了，前提是服务器有多个IP地址</p>
<p>如果需要不同的 IP 对应不同的服务，可在网站前端的负载均衡器上配置</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">当客户端访问192.168.10.120,监听端口号为80,直接跳转到data/www目录下文件</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen       80;</span><br><span class="line">    server_name  192.168.10.120;</span><br><span class="line">    location / &#123;</span><br><span class="line">        root   data/www;</span><br><span class="line">        index  index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">当客户端访问192.168.10.121,监听端口号为80,直接跳转到data/bbs目录下文件</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen       80;</span><br><span class="line">    server_name  192.168.10.121;</span><br><span class="line">    location / &#123;</span><br><span class="line">        root   data/bbs;</span><br><span class="line">        index  index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li>
</ul>
<h3 id="13-配置文件-location-详解"><a href="#13-配置文件-location-详解" class="headerlink" title="13.配置文件 location 详解"></a>13.配置文件 <code>location</code> 详解</h3><blockquote>
<p>location 指令的作用是根据用户请求的 URI 来执行不同的应用，也就是根据用户请求的网站URL进行匹配，匹配成功即进行相关的操作</p>
</blockquote>
<ol>
<li><p>匹配规则</p>
<blockquote>
<p><code>~</code> 代表自己输入的英文字母</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/location%E5%8C%B9%E9%85%8D.png" alt="location匹配"></p>
</li>
<li><p>正则匹配案例</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">优先级1，精确匹配，根路径</span></span><br><span class="line">location =/ &#123;</span><br><span class="line">    return 400;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">优先级2，以某个字符串开头，以av开头的，优先匹配这里，区分大小写</span></span><br><span class="line">location ^~ /av &#123;</span><br><span class="line">    root /data/av/;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">优先级3，区分大小写的正则匹配，匹配/media*****路径</span></span><br><span class="line">location ~ /media &#123;</span><br><span class="line">	alias /data/static/;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">优先级4，不区分大小写的正则匹配，所有的****.jpg|gif|png 都走这里</span></span><br><span class="line">location ~* .*\.(jpg|gif|png|js|css)$ &#123;</span><br><span class="line">	root  /data/av/;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">优先7，通用匹配</span></span><br><span class="line">location / &#123;</span><br><span class="line">	return 403;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li>
</ol>
<h3 id="14-Nginx-限流"><a href="#14-Nginx-限流" class="headerlink" title="14.Nginx 限流"></a>14.Nginx 限流</h3><blockquote>
<p>Nginx 限流就是限制用户请求速度，防止服务器受不了</p>
<p>Nginx 的限流都是基于<strong>漏桶流算法</strong></p>
<p>限流有 3 种：</p>
<p>正常限制访问频率（正常流量）、突发限制访问频率（突发流量）、限制并发连接数</p>
</blockquote>
<ul>
<li><p>正常限制访问频率（正常流量）</p>
<blockquote>
<p>限制一个用户发送的请求，Nginx 多久接收一个请求</p>
<p>Nginx 中使用 <code>ngx_http_limit_req_module</code> 模块来限制的访问频率，限制的原理实质是基于漏桶算法原理来实现的</p>
<p>在 <code>nginx.conf</code> 配置文件中可以使用 <code>limit_req_zone</code> 命令及 <code>limit_req</code> 命令限制单个 IP 的请求处理频率</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">定义限流维度，一个用户一分钟一个请求进来，多余的全部漏掉</span></span><br><span class="line">limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;</span><br><span class="line"><span class="meta prompt_"> </span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">绑定限流维度</span></span><br><span class="line">server&#123; </span><br><span class="line">	location/seckill.html&#123;</span><br><span class="line">		limit_req zone=zone;    </span><br><span class="line">		proxy_pass http://lj_seckill;</span><br><span class="line">	&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<blockquote>
<p><code>1r/s</code> 代表 1 秒接收一个请求</p>
<p><code>1r/m</code> 代表 1 分钟接收一个请求</p>
<p> 如果 Nginx 这时还有别的请求没有处理完，Nginx 就会拒绝处理该用户请求</p>
</blockquote>
</li>
<li><p>突发限制访问频率（突发流量）</p>
<blockquote>
<p>限制一个用户发送的请求，Nginx 多久接收一个</p>
<p>上面的配置一定程度可以限制访问频率，但是也存在着一个问题：如果突发流量超出请求被拒绝处理，无法处理活动时候的突发流量，这时候应该如何进一步处理呢？</p>
<p>Nginx 提供 <code>burst</code> 参数结合 <code>nodelay</code> 参数可以解决流量突发的问题，可以设置能处理的超过设置的请求数外能额外处理的请求数</p>
<p>可以将之前的例子添加 <code>burst</code> 参数以及 <code>nodelay</code>参数：</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">定义限流维度，一个用户一分钟一个请求进来，多余的全部漏掉</span></span><br><span class="line">limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;</span><br><span class="line"><span class="meta prompt_"> </span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">绑定限流维度</span></span><br><span class="line">server&#123; </span><br><span class="line">	location/seckill.html&#123;</span><br><span class="line">		limit_req zone=zone burst=5 nodelay;</span><br><span class="line">		proxy_pass http://lj_seckill;</span><br><span class="line">	&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<blockquote>
<p><code>burst=5 nodelay</code> 代表 Nginx 对于一个用户的请求会立即处理前五个，多余的就慢慢来</p>
<p>没有其他用户的请求就处理该请求，有其他的请求的话 Nginx 就漏掉（不接受）该请求</p>
</blockquote>
</li>
<li><p>限制并发连接数</p>
<blockquote>
<p>Nginx 中的 <code>ngx_http_limit_conn_module</code> 模块提供了限制并发连接数的功能，可以使用 <code>limit_conn_zone</code> 指令以及 <code>limit_conn</code> 执行进行配置</p>
<p>举例如下</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">http &#123;</span><br><span class="line">	limit_conn_zone $binary_remote_addr zone=myip:10m;</span><br><span class="line">	limit_conn_zone $server_name zone=myServerName:10m;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"> server &#123;</span><br><span class="line">     location / &#123;</span><br><span class="line">         limit_conn myip 10;</span><br><span class="line">         limit_conn myServerName 100;</span><br><span class="line">         rewrite / http://www.lijie.net permanent;</span><br><span class="line">     &#125;</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure>

<blockquote>
<p>上面配置了单个 IP 同时并发连接数最多只能 10 个连接，并且设置了整个虚拟服务器同时最大并发数最多只能 100 个链接</p>
<p>当然，只有当请求的 header 被服务器处理后，虚拟服务器的连接数才会计数</p>
<p><strong>刚才有提到过 Nginx 是基于漏桶算法原理实现的，实际上限流一般都是基于漏桶算法和令牌桶算法实现的</strong></p>
</blockquote>
</li>
</ul>
<h3 id="15-漏桶流算法和令牌桶算法"><a href="#15-漏桶流算法和令牌桶算法" class="headerlink" title="15.漏桶流算法和令牌桶算法"></a>15.漏桶流算法和令牌桶算法</h3><ol>
<li><p>漏桶算法</p>
<blockquote>
<p>漏桶算法思路很简单，把水比作是请求，漏桶比作是系统处理能力极限，水先进入到漏桶里，漏桶里的水按一定速率流出，当流出的速率小于流入的速率时，由于漏桶容量有限，后续进入的水直接溢出（拒绝请求），以此实现限流</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/%E6%BC%8F%E6%A1%B6%E7%AE%97%E6%B3%95.png" alt="漏桶算法"></p>
</li>
<li><p>令牌桶算法</p>
<blockquote>
<p>令牌桶算法的原理也比较简单，可以理解成医院的挂号看病，只有拿到号后才可以进行诊病</p>
<p>系统会维护一个令牌（token）桶，以一个恒定的速度往桶里放入令牌（token），这时如果有请求进来想要被处理，则需要先从桶里获取一个令牌（token），当桶里没有令牌（token）可取时，则该请求将被拒绝服务</p>
<p>令牌桶算法通过控制桶的容量、发放令牌的速率，来达到对请求的限制</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95.png" alt="令牌桶算法"></p>
</li>
</ol>
<h3 id="16-Nginx-配置高可用性"><a href="#16-Nginx-配置高可用性" class="headerlink" title="16.Nginx 配置高可用性"></a>16.Nginx 配置高可用性</h3><blockquote>
<p>当上游服务器(真实访问服务器)，一旦出现故障或者是没有及时相应的话，应该直接轮训到下一台服务器，保证服务器的高可用</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen       80;</span><br><span class="line">    server_name  www.lijie.com;</span><br><span class="line">    location / &#123;</span><br><span class="line">        ### 指定上游服务器负载均衡服务器</span><br><span class="line">        proxy_pass http://backServer;</span><br><span class="line">        ### nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间</span><br><span class="line">        proxy_connect_timeout 1s;</span><br><span class="line">        ### nginx发送给上游服务器(真实访问的服务器)超时时间</span><br><span class="line">        proxy_send_timeout 1s;</span><br><span class="line">        ### nginx接受上游服务器(真实访问的服务器)超时时间</span><br><span class="line">        proxy_read_timeout 1s;</span><br><span class="line">        index  index.html index.htm;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<h3 id="17-Nginx-怎么判断别IP不可访问"><a href="#17-Nginx-怎么判断别IP不可访问" class="headerlink" title="17.Nginx 怎么判断别IP不可访问"></a>17.Nginx 怎么判断别IP不可访问</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果访问的ip地址为192.168.10.120,则返回403</span></span><br><span class="line">if ($remote_addr = 192.168.10.120) &#123;  </span><br><span class="line">	return 403;  </span><br><span class="line">&#125;  </span><br></pre></td></tr></table></figure>

<h3 id="18-在-Nginx-中，如何使用未定义的服务器名称来阻止处理请求"><a href="#18-在-Nginx-中，如何使用未定义的服务器名称来阻止处理请求" class="headerlink" title="18.在 Nginx 中，如何使用未定义的服务器名称来阻止处理请求"></a>18.在 Nginx 中，如何使用未定义的服务器名称来阻止处理请求</h3><blockquote>
<p>只需将请求删除的服务器定义为：</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">Server &#123;</span><br><span class="line">    listen 80; </span><br><span class="line">    server_name “ “; </span><br><span class="line">    return 444;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<blockquote>
<p>服务器名被保留一个空字符串，在没有主机头字段的情况下匹配请求，而一个特殊的 nginx 的非标准代码被返回，从而终止连接</p>
</blockquote>
<h3 id="19-怎么限制浏览器访问"><a href="#19-怎么限制浏览器访问" class="headerlink" title="19.怎么限制浏览器访问"></a>19.怎么限制浏览器访问</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment"># 不允许谷歌浏览器访问 如果是谷歌浏览器返回500</span></span></span><br><span class="line">if ($http_user_agent ~ Chrome) &#123;   </span><br><span class="line">	return 500;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<h3 id="20-Rewrite全局变量是什么"><a href="#20-Rewrite全局变量是什么" class="headerlink" title="20.Rewrite全局变量是什么"></a>20.Rewrite全局变量是什么</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">$</span><span class="language-bash">remote_addr        // 获取客户端ip</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">binary_remote_addr // 客户端ip（二进制)</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">remote_port        // 客户端port，如：50472</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">remote_user        // 已经经过Auth Basic Module验证的用户名</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">host           	// 请求主机头字段，否则为服务器名称，如:blog.sakmon.com</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">request        	// 用户请求信息，如：GET ?a=1&amp;b=2 HTTP/1.1</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">request_filename   // 当前请求的文件的路径名，由root或<span class="built_in">alias</span>和URI request组合而成，如：/2013/81.html</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">status         	// 请求的响应状态码,如:200</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">body_bytes_sent    // 响应时送出的body字节数数量。即使连接中断，这个数据也是精确的,如：40</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">content_length     // 等于请求行的“Content_Length”的值</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">content_type       // 等于请求行的“Content_Type”的值</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">http_referer       // 引用地址</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">http_user_agent    // 客户端agent信息,如：Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">args            	// 与<span class="variable">$query_string</span>相同 等于当中URL的参数(GET)，如a=1&amp;b=2</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">document_uri       // 与<span class="variable">$uri</span>相同  这个变量指当前的请求URI，不包括任何参数(见<span class="variable">$args</span>) 如:/2013/81.html</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">document_root      // 针对当前请求的根路径设置值</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">hostname           // 如：centos53.localdomain</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">http_cookie        // 客户端cookie信息</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">cookie_COOKIE      // cookie COOKIE变量的值</span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash">is_args    		// 如果有<span class="variable">$args</span>参数，这个变量等于”?”，否则等于”<span class="string">&quot;，空值，如? <span class="variable">$limit_rate</span> 		 // 这个变量可以限制连接速率，0表示不限速</span></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">query_string       // 与<span class="variable">$args</span>相同 等于当中URL的参数(GET)，如a=1&amp;b=2 <span class="variable">$request_body</span>       // 记录POST过来的数据信息</span></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">request_body_file  // 客户端请求主体信息的临时文件名</span></span> </span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">request_method     // 客户端请求的动作，通常为GET或POST,如：GET</span></span> </span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">request_uri        // 包含请求参数的原始URI，不包含主机名，如：/2013/81.htmla=1&amp;b=2</span></span> </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">scheme     		// HTTP方法（如http，https）,如：http</span></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">uri            	// 这个变量指当前的请求URI，不包括任何参数(见<span class="variable">$args</span>) 如:/2013/81.html</span></span> </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">request_completion // 如果请求结束，设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时，为空(Empty)，如：OK</span></span> </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">server_protocol    // 请求使用的协议，通常是HTTP/1.0或HTTP/1.1，如：HTTP/1.1 <span class="variable">$server_addr</span>        // 服务器IP地址，在完成一次系统调用后可以确定这个值</span></span> </span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">server_name        // 服务器名称，如：blog.sakmon.com</span></span> </span><br><span class="line"><span class="meta prompt_">$</span><span class="language-bash"><span class="string">server_port        // 请求到达服务器的端口号,如：80</span></span></span><br></pre></td></tr></table></figure>

<h3 id="21-Nginx-如何实现后端服务的健康检查"><a href="#21-Nginx-如何实现后端服务的健康检查" class="headerlink" title="21.Nginx 如何实现后端服务的健康检查"></a>21.Nginx 如何实现后端服务的健康检查</h3><ul>
<li>方式1：利用 nginx 自带模块  <code>ngx_http_proxy_module</code>  和  <code>ngx_http_upstream_module</code>  对后端节点做健康检查</li>
<li>方式2（推荐）：利用  <code>nginx_upstream_check_module</code> 模块对后端节点做健康检查</li>
</ul>
<h3 id="22-Nginx-如何开启压缩"><a href="#22-Nginx-如何开启压缩" class="headerlink" title="22.Nginx 如何开启压缩"></a>22.Nginx 如何开启压缩</h3><blockquote>
<p>开启 <code>nginx gzip</code> 压缩后，网页、css、js 等静态资源的大小会大大的减少，从而可以节约大量的带宽，提高传输效率</p>
<p>虽然会消耗 cpu 资源，但是为了给用户更好的体验是值得的</p>
<p>开启的配置如下：</p>
<p>将以下配置放到 <code>nginx.conf</code> 的 <code>http&#123; … &#125;</code> 节点中</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">http &#123;</span><br><span class="line">      # 开启gzip</span><br><span class="line">      gzip on;</span><br><span class="line">      # 启用gzip压缩的最小文件；小于设置值的文件将不会被压缩</span><br><span class="line">      gzip_min_length 1k;</span><br><span class="line">      # gzip 压缩级别 1-10 </span><br><span class="line">      gzip_comp_level 2;</span><br><span class="line">      # 进行压缩的文件类型。</span><br><span class="line">      gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;</span><br><span class="line">      # 是否在http header中添加Vary: Accept-Encoding，建议开启</span><br><span class="line">      gzip_vary on;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<blockquote>
<p>保存并重启 nginx，刷新页面（为了避免缓存，请强制刷新）就能看到效果了</p>
<p>gzip 压缩前后效果对比：jquery 原大小 90kb，压缩后只有 30kb</p>
<p>gzip 虽然好用，但是以下类型的资源不建议启用</p>
</blockquote>
<ul>
<li><h5 id="图片类型"><a href="#图片类型" class="headerlink" title="图片类型"></a>图片类型</h5><blockquote>
<p>图片如 jpg、png 本身就会有压缩，所以就算开启 gzip 后，压缩前和压缩后大小没有多大区别，所以开启了反而会白白的浪费资源</p>
</blockquote>
</li>
<li><p><strong>大文件</strong></p>
<blockquote>
<p>会消耗大量的 cpu 资源，且不一定有明显的效果</p>
</blockquote>
</li>
</ul>
<h3 id="23-ngx-http-upstream-module-的作用是什么"><a href="#23-ngx-http-upstream-module-的作用是什么" class="headerlink" title="23.ngx_http_upstream_module 的作用是什么"></a>23.ngx_http_upstream_module 的作用是什么</h3><blockquote>
<p><code>ngx_http_upstream_module</code> 用于定义可通过 <code>fastcgi</code>传递、<code>proxy</code>传递、<code>uwsgi</code>传递、 <code>memcached</code>传递和 <code>scgi</code>传递指令来引用的服务器组</p>
</blockquote>
<h3 id="24-什么是-C10K-问题"><a href="#24-什么是-C10K-问题" class="headerlink" title="24.什么是 C10K 问题"></a>24.什么是 C10K 问题</h3><blockquote>
<p>C10K 问题是指无法同时处理大量客户端（10,000）的网络套接字</p>
<p>C10K 问题的本质上是操作系统的问题</p>
<p>对于 Web 1.0&#x2F;2.0 时代的操作系统，传统的同步阻塞 I&#x2F;O 模型处理方式都是 <code>requests per second</code></p>
<p>当创建的进程或线程多了，数据拷贝频繁（缓存I&#x2F;O、内核将数据拷贝到用户进程空间、阻塞，进程&#x2F;线程上下文切换消耗大， 导致操作系统崩溃，这就是 C10K 问题的本质</p>
<p><strong>解决 C10K 问题的关键就是尽可能减少这些 CPU 资源消耗</strong></p>
<p>解决思路：</p>
</blockquote>
<ul>
<li><p>每个进程&#x2F;线程处理一个连接</p>
<blockquote>
<p>该思路最为直接，但是申请进程&#x2F;线程是需要系统资源的，且系统需要管理这些进程&#x2F;线程，所以会使资源占用过多，可扩展性差</p>
</blockquote>
</li>
<li><p>每个进程&#x2F;线程同时处理多个连接（I&#x2F;O多路复用）</p>
<blockquote>
<p>select、poll、epoll</p>
</blockquote>
</li>
</ul>
<h3 id="25-Nginx-是否支持将请求压缩到上游？"><a href="#25-Nginx-是否支持将请求压缩到上游？" class="headerlink" title="25.Nginx 是否支持将请求压缩到上游？"></a>25.Nginx 是否支持将请求压缩到上游？</h3><blockquote>
<p>可以使用 Nginx 模块 <code>gunzip</code> 将请求压缩到上游</p>
<p><code>gunzip</code> 模块是一个过滤器，它可以对不支持 <code>gzip</code> 编码方法的客户机或服务器使用<code>内容编码:gzip</code> 来解压缩响应</p>
</blockquote>
<h3 id="26-如何在-Nginx-中获得当前的时间？"><a href="#26-如何在-Nginx-中获得当前的时间？" class="headerlink" title="26.如何在 Nginx 中获得当前的时间？"></a>26.如何在 Nginx 中获得当前的时间？</h3><blockquote>
<p>要获得 Nginx 的当前时间，必须使用 SSI 模块、和 <code>date_local</code> 的变量</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">Proxy_set_header THE-TIME $date_gmt;</span><br></pre></td></tr></table></figure>

<h3 id="27-用-Nginx-服务器解释-s的目的是什么？"><a href="#27-用-Nginx-服务器解释-s的目的是什么？" class="headerlink" title="27.用 Nginx 服务器解释 -s的目的是什么？"></a>27.用 Nginx 服务器解释 <code>-s</code>的目的是什么？</h3><blockquote>
<p>用于运行 <code>Nginx -s</code> 参数的可执行文件</p>
</blockquote>
<h3 id="28-如何在-Nginx-服务器上添加模块？"><a href="#28-如何在-Nginx-服务器上添加模块？" class="headerlink" title="28.如何在 Nginx 服务器上添加模块？"></a>28.如何在 Nginx 服务器上添加模块？</h3><blockquote>
<p>在编译过程中，必须选择 Nginx 模块，因为 Nginx 不支持模块的运行时间选择</p>
</blockquote>
<h3 id="29-生产中如何设置-worker-进程的数量呢？"><a href="#29-生产中如何设置-worker-进程的数量呢？" class="headerlink" title="29.生产中如何设置 worker 进程的数量呢？"></a>29.生产中如何设置 worker 进程的数量呢？</h3><blockquote>
<p>在有多个 cpu 的情况下，可以设置多 worker</p>
<p>worker 进程的数量可以设置到和 cpu 的核心数一样多</p>
<p>如果在单个 cpu 上起多个 worker 进程，那么操作系统会在多个 worker 之间进行调度，这种情况会降低系统性能，如果只有一个 cpu，那么只启动一个 worker 进程就足够了</p>
</blockquote>
<h3 id="30-Nginx-状态码（同-http-状态码）"><a href="#30-Nginx-状态码（同-http-状态码）" class="headerlink" title="30.Nginx 状态码（同 http 状态码）"></a>30.Nginx 状态码（同 http 状态码）</h3><ul>
<li><p>200：服务器成功返回网</p>
</li>
<li><p>403：服务器拒绝请求</p>
</li>
<li><p>404：请求的网页不存在 </p>
</li>
<li><p>499：服务端处理时间过长，客户端主动关闭了连接</p>
</li>
<li><p>502：服务器作为网关或代理，从上游服务器收到无效响应</p>
<ul>
<li><p>FastCGI 进程是否已经启动</p>
</li>
<li><p>FastCGI worker 进程数是否不够</p>
</li>
<li><p>FastCGI 执行时间过长</p>
<ul>
<li>fastcgi_connect_timeout 300;</li>
<li>fastcgi_send_timeout 300;</li>
<li>fastcgi_read_timeout 300;</li>
</ul>
</li>
<li><p>FastCGI Buffer 不够，nginx 和 apache 一样，有前端缓冲限制，可以调整缓冲参数</p>
<ul>
<li>fastcgi_buffer_size 32k;</li>
<li>fastcgi_buffers 8 32k;</li>
</ul>
</li>
<li><p>Proxy Buffer 不够，如果用了 Proxying，调整</p>
<ul>
<li>proxy_buffer_size 16k;</li>
<li>proxy_buffers 4 16k;</li>
</ul>
</li>
<li><p>php 脚本执行时间过长</p>
<blockquote>
<p>将 <code>php-fpm.conf</code> 的 <code>0s</code> 改成一个时间</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h3 id="31-IO详解"><a href="#31-IO详解" class="headerlink" title="31.IO详解"></a>31.IO详解</h3><ol>
<li><p>什么是 IO</p>
<p> <img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/IO%E5%AE%9A%E4%B9%89.png" alt="IO定义"></p>
</li>
<li><p>同步 VS 异步、阻塞 VS 非阻塞</p>
<ul>
<li>同步，一个任务的完成之前不能做其他操作，必须等待（等于在打电话） </li>
<li>异步，一个任务的完成之前，可以进行其他操作（等于在聊QQ） </li>
<li>阻塞，是相对于 CPU 来说的， 挂起当前线程，不能做其他操作只能等待 </li>
<li>非阻塞,，无须挂起当前线程，可以去执行其他操作</li>
</ul>
</li>
<li><p>五种 IO 模型</p>
<ul>
<li><p><strong>BIO 同步并阻塞（blocking I&#x2F;O）</strong></p>
<blockquote>
<p>服务器实现一个连接一个线程，即客户端有连接请求时服务器端就需要启动一个线程进行处理，没处理完之前此线程不能做其他操作（如果是单线程的情况下，我传输的文件很大呢？），当然可以通过线程池机制改善</p>
<p>BIO 方式适用于连接数目比较小且固定的架构，这种方式对服务器资源要求比较高，并发局限于应用中，JDK1.4 以前的唯一选择，但程序直观简单易理解</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/BIO.png" alt="BIO"></p>
</li>
<li><p><strong>NIO 同步非阻塞（noblocking I&#x2F;O）</strong></p>
<blockquote>
<p>服务器实现一个连接一个线程，即客户端发送的连接请求都会注册到多路复用器上，多路复用器轮询到连接有 I&#x2F;O 请求时才启动一个线程进行处理</p>
<p>NIO 方式适用于连接数目多且连接比较短（轻操作）的架构，比如聊天服务器，并发局限于应用中，编程比较复杂，JDK1.4之后开始支持</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/NIO.png" alt="NIO"></p>
</li>
<li><p><strong>AIO 异步非阻塞（asynchronous I&#x2F;O）</strong></p>
<blockquote>
<p>服务器实现模式为一个有效请求一个线程，客户端的 I&#x2F;O 请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理</p>
<p>AIO 方式使用于连接数目多且连接比较长（重操作）的架构，比如相册服务器，充分调用操作系统参与并发操作，编程比较复杂，JDK1.7 之后开始支持</p>
<p>AIO 属于 NIO 包中的类实现，其实 IO 主要分为 BIO 和 NIO，AIO 只是附加品，解决 IO 不能异步的实现 </p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/AIO.png" alt="AIO"></p>
</li>
<li><p><strong>信号驱动 IO（signal blocking I&#x2F;O）</strong></p>
<blockquote>
<p>G 也在河边钓鱼，但与 A、B、C 不同的是，G 比较聪明，他给鱼竿上挂一个铃铛，当有鱼上钩的时候，这个铃铛就会被碰响，G 就会将鱼钓上来</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/%E4%BF%A1%E5%8F%B7%E9%A9%B1%E5%8A%A8IO.png" alt="信号驱动IO"></p>
</li>
<li><p><strong>IO 多路转接（I&#x2F;O multiplexing）</strong></p>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/IO%E5%A4%9A%E8%B7%AF%E8%BD%AC%E6%8E%A5.png" alt="IO多路转接"></p>
</li>
</ul>
</li>
<li><p>BIO、NIO、AIO 的区别</p>
<ul>
<li><p>BIO 是阻塞的；NIO 是非阻塞的</p>
</li>
<li><p>BIO 是面向流的，只能单向读写；NIO 是面向缓冲的，可以双向读写 </p>
</li>
<li><p>使用 BIO 做 Socket 连接时，由于单向读写，当没有数据时会挂起当前线程，阻塞等待，为防止影响其它连接，需要为每个连接新建线程处理。然而系统资源是有限的，不能过多的新建线程，线程过多带来线程上下文的切换，从来带来更大的性能损耗，因此需要使用 NIO 进行 BIO 多路复用，使用一个线程来监听所有 Socket 连接，使用本线程或者其他线程处理连接 </p>
</li>
<li><p>AIO 是非阻塞以异步方式发起 I&#x2F;O 操作</p>
<blockquote>
<p>当 I&#x2F;O 操作进行时可以去做其他操作，由操作系统内核空间提醒 IO 操作已完成</p>
</blockquote>
</li>
</ul>
</li>
</ol>
</article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="https://gitee.com/zcmmmm/zcmmmm">zcm</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="https://gitee.com/zcmmmm/zcmmmm/2022/10/16/Nginx%E9%9D%A2%E7%BB%8F/">https://gitee.com/zcmmmm/zcmmmm/2022/10/16/Nginx%E9%9D%A2%E7%BB%8F/</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="https://gitee.com/zcmmmm/zcmmmm" target="_blank">无人深空</a>！</span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/Nginx/">Nginx</a></div><div class="post_share"><div class="social-share" data-image="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png" data-sites="facebook,twitter,wechat,weibo,qq"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/butterfly-extsrc/sharejs/dist/css/share.min.css" media="print" onload="this.media='all'"><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc/sharejs/dist/js/social-share.min.js" defer></script></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/2022/10/17/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9D%A2%E7%BB%8F/"><img class="prev-cover" src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Database/DataBase.png" onerror="onerror=null;src='/img/404.jpg'" alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">数据库面经</div></div></a></div><div class="next-post pull-right"><a href="/2022/10/15/Nginx%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"><img class="next-cover" src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png" onerror="onerror=null;src='/img/404.jpg'" alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">Nginx基础知识</div></div></a></div></nav><div class="relatedPosts"><div class="headline"><i class="fas fa-thumbs-up fa-fw"></i><span>相关推荐</span></div><div class="relatedPosts-list"><div><a href="/2022/10/15/Nginx%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/" title="Nginx基础知识"><img class="cover" src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-10-15</div><div class="title">Nginx基础知识</div></div></a></div></div></div></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span><span class="toc-percentage"></span></div><div class="toc-content is-expand"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#Nginx-%E9%9D%A2%E7%BB%8F"><span class="toc-text">Nginx 面经</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1-Nginx-%E4%BB%8B%E7%BB%8D"><span class="toc-text">1.Nginx 介绍</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2-Nginx-%E6%80%8E%E4%B9%88%E5%A4%84%E7%90%86%E8%AF%B7%E6%B1%82"><span class="toc-text">2.Nginx 怎么处理请求</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3-Nginx-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E9%AB%98%E5%B9%B6%E5%8F%91"><span class="toc-text">3.Nginx 如何实现高并发</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4-Nginx-%E4%BB%A3%E7%90%86"><span class="toc-text">4.Nginx 代理</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-Nginx-%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84"><span class="toc-text">5.Nginx 目录结构</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6-Nginx-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6-nginx-conf"><span class="toc-text">6.Nginx 配置文件 nginx.conf</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-%E4%B8%BA%E4%BB%80%E4%B9%88-Nginx-%E4%B8%8D%E9%80%82%E7%94%A8%E5%A4%9A%E7%BA%BF%E7%A8%8B"><span class="toc-text">7.为什么 Nginx 不适用多线程</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#8-Nginx-%E5%92%8C-apache-%E7%9A%84%E5%8C%BA%E5%88%AB"><span class="toc-text">8.Nginx 和 apache 的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#9-%E5%8A%A8%E9%9D%99%E5%88%86%E7%A6%BB"><span class="toc-text">9.动静分离</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#10-Nginx%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E7%9A%84%E7%AE%97%E6%B3%95%E6%80%8E%E4%B9%88%E5%AE%9E%E7%8E%B0%E7%9A%84-%E7%AD%96%E7%95%A5%E6%9C%89%E5%93%AA%E4%BA%9B"><span class="toc-text">10.Nginx负载均衡的算法怎么实现的?策略有哪些?</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#11-%E5%A6%82%E4%BD%95%E7%94%A8Nginx%E8%A7%A3%E5%86%B3%E5%89%8D%E7%AB%AF%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98%EF%BC%9F"><span class="toc-text">11.如何用Nginx解决前端跨域问题？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#12-Nginx%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E6%80%8E%E4%B9%88%E9%85%8D%E7%BD%AE%EF%BC%9F"><span class="toc-text">12.Nginx虚拟主机怎么配置？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#13-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6-location-%E8%AF%A6%E8%A7%A3"><span class="toc-text">13.配置文件 location 详解</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#14-Nginx-%E9%99%90%E6%B5%81"><span class="toc-text">14.Nginx 限流</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#15-%E6%BC%8F%E6%A1%B6%E6%B5%81%E7%AE%97%E6%B3%95%E5%92%8C%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95"><span class="toc-text">15.漏桶流算法和令牌桶算法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#16-Nginx-%E9%85%8D%E7%BD%AE%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7"><span class="toc-text">16.Nginx 配置高可用性</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#17-Nginx-%E6%80%8E%E4%B9%88%E5%88%A4%E6%96%AD%E5%88%ABIP%E4%B8%8D%E5%8F%AF%E8%AE%BF%E9%97%AE"><span class="toc-text">17.Nginx 怎么判断别IP不可访问</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#18-%E5%9C%A8-Nginx-%E4%B8%AD%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%9C%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%90%8D%E7%A7%B0%E6%9D%A5%E9%98%BB%E6%AD%A2%E5%A4%84%E7%90%86%E8%AF%B7%E6%B1%82"><span class="toc-text">18.在 Nginx 中，如何使用未定义的服务器名称来阻止处理请求</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#19-%E6%80%8E%E4%B9%88%E9%99%90%E5%88%B6%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%BF%E9%97%AE"><span class="toc-text">19.怎么限制浏览器访问</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#20-Rewrite%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E6%98%AF%E4%BB%80%E4%B9%88"><span class="toc-text">20.Rewrite全局变量是什么</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#21-Nginx-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%90%8E%E7%AB%AF%E6%9C%8D%E5%8A%A1%E7%9A%84%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5"><span class="toc-text">21.Nginx 如何实现后端服务的健康检查</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#22-Nginx-%E5%A6%82%E4%BD%95%E5%BC%80%E5%90%AF%E5%8E%8B%E7%BC%A9"><span class="toc-text">22.Nginx 如何开启压缩</span></a><ol class="toc-child"><li class="toc-item toc-level-5"><a class="toc-link" href="#%E5%9B%BE%E7%89%87%E7%B1%BB%E5%9E%8B"><span class="toc-text">图片类型</span></a></li></ol></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#23-ngx-http-upstream-module-%E7%9A%84%E4%BD%9C%E7%94%A8%E6%98%AF%E4%BB%80%E4%B9%88"><span class="toc-text">23.ngx_http_upstream_module 的作用是什么</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#24-%E4%BB%80%E4%B9%88%E6%98%AF-C10K-%E9%97%AE%E9%A2%98"><span class="toc-text">24.什么是 C10K 问题</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#25-Nginx-%E6%98%AF%E5%90%A6%E6%94%AF%E6%8C%81%E5%B0%86%E8%AF%B7%E6%B1%82%E5%8E%8B%E7%BC%A9%E5%88%B0%E4%B8%8A%E6%B8%B8%EF%BC%9F"><span class="toc-text">25.Nginx 是否支持将请求压缩到上游？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#26-%E5%A6%82%E4%BD%95%E5%9C%A8-Nginx-%E4%B8%AD%E8%8E%B7%E5%BE%97%E5%BD%93%E5%89%8D%E7%9A%84%E6%97%B6%E9%97%B4%EF%BC%9F"><span class="toc-text">26.如何在 Nginx 中获得当前的时间？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#27-%E7%94%A8-Nginx-%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A7%A3%E9%87%8A-s%E7%9A%84%E7%9B%AE%E7%9A%84%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F"><span class="toc-text">27.用 Nginx 服务器解释 -s的目的是什么？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#28-%E5%A6%82%E4%BD%95%E5%9C%A8-Nginx-%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E6%B7%BB%E5%8A%A0%E6%A8%A1%E5%9D%97%EF%BC%9F"><span class="toc-text">28.如何在 Nginx 服务器上添加模块？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#29-%E7%94%9F%E4%BA%A7%E4%B8%AD%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE-worker-%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%95%B0%E9%87%8F%E5%91%A2%EF%BC%9F"><span class="toc-text">29.生产中如何设置 worker 进程的数量呢？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#30-Nginx-%E7%8A%B6%E6%80%81%E7%A0%81%EF%BC%88%E5%90%8C-http-%E7%8A%B6%E6%80%81%E7%A0%81%EF%BC%89"><span class="toc-text">30.Nginx 状态码（同 http 状态码）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#31-IO%E8%AF%A6%E8%A7%A3"><span class="toc-text">31.IO详解</span></a></li></ol></li></ol></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">&copy;2022 - 2023 By zcm</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div id="local-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">搜索</span><span id="loading-status"></span><button class="search-close-button"><i class="fas fa-times"></i></button></nav><div class="is-center" id="loading-database"><i class="fas fa-spinner fa-pulse"></i><span>  数据库加载中</span></div><div class="search-wrap"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="搜索文章" type="text"/></div></div><hr/><div id="local-search-results"></div></div></div><div id="search-mask"></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.umd.min.js"></script><script src="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.js"></script><script src="/js/search/local-search.js"></script><div class="js-pjax"></div><script src="/js/categories.js?v1"></script><script src="/js/navigation.js?v1"></script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>